package org.abadirou.cdebacker.flst;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.NoResultException;

import org.abadirou.cdebacker.flst.api.OptionChambre;
import org.abadirou.cdebacker.flst.api.dao.OptionChambreDao;
import org.abadirou.cdebacker.flst.entity.OptionChambreImpl;

import com.google.inject.Inject;
import com.google.inject.Singleton;

@SuppressWarnings("unchecked")
@Singleton
public class JPAOptionChambreDao implements OptionChambreDao {

	@Inject
	EntityManager em;

	@Override
	public List<OptionChambre> getAllOptionChambre() {
		return em.createNamedQuery(OptionChambreImpl.ALL_OPTION)
				.getResultList();
	}

	@Override
	public OptionChambre getOrCreateOptionChambre(String option) {
		OptionChambre optionChambre = getOption(option);

		if (optionChambre == null) {
			optionChambre = createOption(option);
		}

		return optionChambre;
	}

	private OptionChambre createOption(String name) {
		OptionChambreImpl option = new OptionChambreImpl(name);
		em.getTransaction().begin();
		em.persist(option);
		em.getTransaction().commit();
		return option;
	}

	private OptionChambre getOption(String option) {
		try {
			return (OptionChambre) em
					.createNamedQuery(OptionChambreImpl.OPTION_BY_NAME)
					.setParameter("name", option).getSingleResult();
		} catch (NoResultException e) {
			return null;
		}
	}

	@Override
	public void deleteOption(OptionChambre optionChambre) {
		em.getTransaction().begin();
		em.remove((OptionChambreImpl) optionChambre);
		em.getTransaction().commit();
	}

}
